%Primeri koji mogu da budu od koristi za bolje razumevanje rada SPREGNUTOG
%monofaznog invertora
%USLOV: Ts mora da deli 1/f1 (T1) bez ostatka

clear all; close all; clc;

f1=50; T=1/f1; %ucestanost i period modulisuceg signala
fs=2500; Ts=1/fs; %ucestanost i period nosioca
vreme=linspace(0,2*T,10000); n=1;

%formiranje trougaonog nosioca
nosilac=zeros(1,length(vreme)); 
%for petlja za formiranje trougaonog nosioca koja krece sa pocetnom vrednoscu -1
for i=1:1:length(vreme)
    if vreme(i)>(n+1)*Ts/2
        n=n+2;
    end
    if vreme(i)<=n*Ts/2
        nosilac(i)=4/Ts*(vreme(i)-(2*n-1)*Ts/4);
    else
        nosilac(i)=-4/Ts*(vreme(i)-(2*n+1)*Ts/4);
    end
end


%PRIMER 1: plotovanje nosioca, modulisuceg signala, izlaznog napona,
%srednje vrednosti izlaznog napona na intervalu Ts i osnovnog harmonika
%izlaznog napona za priozvoljno odabrano m
disp(sprintf('Primer 1: Princip rada monofaznog invertora sa spregnutim upravljanjem'));
m = input('Unesi indeks modulacije invertora m: ');
figure(1)
modulisuci=m*sin(2*pi*f1*vreme);
subplot(3,1,1);
hold on; plot(vreme,nosilac,vreme,modulisuci); grid; 
xlabel('t(s)'); title('Nosilac i modulisuci signal');
u=sign(modulisuci-nosilac);% u(t)/Vdc
subplot(3,1,2); 
plot(vreme,u); grid; 
xlabel('t(s)'); ylabel('u(t)/Vdc');
ylim([-1.5,1.5]); title('Izlazni napon invertora');

subplot(3,1,3);
SrVredn=zeros(1,max(vreme)/Ts); %ocekuje se da Ts deli T bez ostatka
i=1; k=1; dt=vreme(2)-vreme(1);%neophodno za numericko integraljenje
while i<=length(vreme)
    if vreme(i)>k*Ts
       k=k+1;
    end
     SrVredn(k)=SrVredn(k)+u(i)*dt;
     i=i+1;
end
SrVredn=SrVredn/Ts;
%NAPOMENA: Dakle, SrVredn predstavlja srednju vrednost izlaznog napona
%invertura na intervalu odabiranja, odnosno na intervalu duzine Ts

t1=linspace(0,max(vreme),length(SrVredn)); %t1 jesu diskretni vremenski trenuci u 
%kojima posmatramo srednju vrednost izlaznog napona. Broj ovih trenutaka u
%toku cele period je zapravo jednak kolicniku fs i f1

%NALAZENJE OSNOVNOG HARMONIKA NAPONA Vout
A1=2/max(vreme)*sum(u.*sin(2*pi*f1*vreme)*dt);
v1out=A1*sin(2*pi*f1*vreme);
plot(t1,SrVredn,vreme,v1out); grid;
xlabel('t(s)'); title('<v(t)>Ts/Vdc, v1(t)/Vdc'); % oznakom <x>Ts se oznacava
%srednja vrednost promenljive x na intervalu Ts. Ova vrednost moze, ali ne
%mora da bude funkcija od vremena t (npr. kod copera je srednja vrednost
%izlaznog napona na prekidackoj ucestanost konstantna, dok se kod invertora
%funkcija vremena)
legend('<v(t)>Ts/Vdc','v1(t)/Vdc');
disp(sprintf('\nZakljucak: Na poslednjem grafiku je moguce uociti kako se, za razlicito m,\ntokom vremena menjaju osnovni harmonik izlaznog napona i srednja vrednost izlaznog napona na intervalu Ts. \nZa m<1 ova dva grafika su skoro podudarna.'));
disp(sprintf('\nPritisni ENTER za prelazak na sledeci primer'));
pause; % u command window treba udariti enter



%PRIMER 2: Zavisnost amplitude osnovnog harmonika izlaznog napona od indeksa modulacije
disp(sprintf('\nPRIMER 2: Zavisnost amplitude osnovnog harmonika izlaznog napona od indeksa modulacije\n'));
i=1;
m_square_wave=1/sin(2*pi*f1*Ts/2); %indeks modulacije pri kom invertor ulazi u square wave mode
m_square_wave=round(m_square_wave)+1; %zaokruzivanje na prvu vecu celobrojnu vrednost
m=0:0.05:m_square_wave; %indeks modulacije
dt=vreme(2)-vreme(1); %neophodno za numericku integraciju
A1=zeros(1,length(m)); %formiranje vektor amplituda osn. harmonika

for i=1:1:length(m);
modulisuci=m(i)*sin(2*pi*f1*vreme); %m indeks modulacije je kolicnik amplituda modulisuceg signala i nosioca
u=sign(modulisuci-nosilac);
A1(i)=2/max(vreme)*sum(u.*sin(2*pi*f1*vreme)*dt); %proces numericke integracije
end
figure(2)
plot(m,A1) % zavisnost amplitude osnovnog harmonika od indeksa modulacije
grid;
title('Uticaj indeksa modulacije na amplitudu osnovnog harmonika');
xlabel('m'); ylabel('V1max/Vdc');

%Zakljucak: kao sto se vidi sa grafika maksimalna vrednost amplitude
%osnovog harmonika kod monofaznog mosnog invertora iznosi 4/pi*Vdc, gde je
%Vdc napon jednosmernog medjukola
disp(sprintf('Zakljucak: kao sto se vidi sa grafika maksimalna vrednost amplitude'));
disp(sprintf('osnovog harmonika kod monofaznog mosnog invertora iznosi 4/pi*Vdc,'));
disp(sprintf('gde je Vdc napon jednosmernog medjukola.\n\n'));

disp(sprintf('Pritisni ENTER za prelazak na sledeci primer'));
pause;
disp(sprintf('\nPRIMER 3: plotovanje talasnih oblika izlaznog napona za 4 razlicite'));
disp(sprintf('vrednosti indeksa modulacije (koje je moguce menjati u telu programa)'));

%PRIMER 3: plotovanje talasnih oblika izlaznog napona za 4 razlicite
%vrednosti indeksa modulacije
n=1;
m_pr=[0.8 2.7 13 m_square_wave];
figure(3); hold on;

%petlja za plotovanje

for i=1:1:length(m_pr)
    subplot(2,4,i);
    n=find(m==m_pr(i));
    modulisuci=m(n)*sin(2*pi*f1*vreme);
    u=sign(modulisuci-nosilac);
    A = 2/max(vreme)*sum(u.*sin(2*pi*f1*vreme)*dt);
    plot(vreme,u); ylim([-1.2 1.2]);
    title(sprintf(' m = %g\n A1 = %g',m_pr(i),round(A,1+2*(i>1))));
    subplot(2,4,[5 6 7 8]); 
    hold on
    plot(m_pr(i),A,'o');
end
subplot(2,4,[5 6 7 8]); plot(m,A1,'b'); grid; title('Radna tacka na grafiku V1max(m)/Vdc');
